package beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import menagement.PacketMgr;
import menagement.UserMgr;
import menagement.dto.EscursioneDTO;
import menagement.dto.EscursioniPacchettoDTO;
import menagement.dto.HotelDTO;
import menagement.dto.HotelPacchettoDTO;
import menagement.dto.PacketDTO;
import menagement.dto.VoloDTO;

import org.primefaces.event.RowEditEvent;

@ManagedBean(name="beanPacchetto")
@ViewScoped
public class PacketBean implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@EJB
	private PacketMgr packetMgr;
	@EJB
	private UserMgr userMgr;
	
	private PacketDTO packet;
	private VoloDTO volo;
	private HotelPacchettoDTO hotel;
	private EscursioniPacchettoDTO escursione;
	private String cittaArrivo;
	private int prezzoHotel;
	private int prezzoEscursione;
	private int prezzoVolo;
	private int permanenza=0;
	
	public PacketBean(){
		packet= new PacketDTO();
		volo=new VoloDTO();
		hotel=new HotelPacchettoDTO();
		escursione= new EscursioniPacchettoDTO();
	}

	
	public int getPermanenza() {
		return permanenza;
	}
	public void setPermanenza(int permanenza) {
		this.permanenza = permanenza;
	}
	public String getCittaArrivo() {
		return cittaArrivo;
	}
	public void setCittaArrivo(String cittaArrivo) {
		this.cittaArrivo = cittaArrivo;
	}
	public PacketMgr getPacketMgr() {
		return packetMgr;
	}
	public void setPacketMgr(PacketMgr packetMgr) {
		this.packetMgr = packetMgr;
	}
	public UserMgr getUserMgr() {
		return userMgr;
	}
	public void setUserMgr(UserMgr userMgr) {
		this.userMgr = userMgr;
	}


	
	public int getPrezzoVolo() {
		return prezzoVolo;
	}


	public void setPrezzoVolo(int prezzoVolo) {
		this.prezzoVolo = prezzoVolo;
	}


	public int getPrezzoHotel() {
		return prezzoHotel;
	}


	public void setPrezzoHotel(int prezzoHotel) {
		this.prezzoHotel = prezzoHotel;
	}


	public int getPrezzoEscursione() {
		return prezzoEscursione;
	}


	public void setPrezzoEscursione(int prezzoEscursione) {
		this.prezzoEscursione = prezzoEscursione;
	}


	public PacketDTO getPacket() {
		return packet;
	}



	public void setPacket(PacketDTO packet) {
		this.packet = packet;
	}



	public VoloDTO getVolo() {
		return volo;
	}



	public void setVolo(VoloDTO volo) {
		this.volo = volo;
	}



	public HotelPacchettoDTO getHotel() {
		return hotel;
	}



	public void setHotel(HotelPacchettoDTO hotel) {
		this.hotel = hotel;
	}



	public EscursioniPacchettoDTO getEscursione() {
		return escursione;
	}



	public void setEscursione(EscursioniPacchettoDTO escursione) {
		this.escursione = escursione;
	}



	public String savePacchetto() {
		if(volo.getCodice()!=0){
			packet.setCodiceVolo(volo.getCodice());
			packet.setEmail(userMgr.getUserDTO().getEmail());
			packetMgr.savePacchetto(packet, hotel, escursione);
			return "index?faces-redirect=true";
		}
		else{
			FacesMessage msg = new FacesMessage("Selezionare un volo!!!","");
	        FacesContext.getCurrentInstance().addMessage(null, msg);
			return null;
		}
			
		
	}
	
	public void editPacchetto(RowEditEvent event){
		packetMgr.update(((PacketDTO) event.getObject()), userMgr.getUserDTO().getEmail());
		FacesMessage msg = new FacesMessage("Pacchetto modificato",((PacketDTO) event.getObject()).getNome());
        FacesContext.getCurrentInstance().addMessage(null, msg);
        System.out.println(((PacketDTO) event.getObject()).getNome());
	}
	
	public void cancelPacchetto(RowEditEvent event) {
		packetMgr.deletePacchetto(((PacketDTO) event.getObject()));
        FacesMessage msg = new FacesMessage("Pacchetto cancellato",((PacketDTO) event.getObject()).getNome());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
	
	public void calcolaPrezzoHotel(){
		
		HotelDTO h=packetMgr.getHotel(hotel.getIdHotel());
		prezzoHotel=h.getPrezzo()*permanenza;
		int totale=(int)(Math.ceil((prezzoVolo+prezzoHotel+prezzoEscursione)*1.15)); //aggiungo il 15% di guadagno
		packet.setPrezzo(totale);
		
	}
	public void calcolaPrezzoEscursione(){
		
		EscursioneDTO e=packetMgr.getEscursione(escursione.getIdEscursione());
		prezzoEscursione=e.getPrezzo();
		int totale=(int)(Math.ceil((prezzoVolo+prezzoHotel+prezzoEscursione)*1.15)); //aggiungo il 15% di guadagno
		packet.setPrezzo(totale);
		
		
	}
	public void calcolaPrezzoVolo(){
		VoloDTO v=packetMgr.getVolo(volo.getCodice());
		prezzoHotel=0;
		prezzoEscursione=0;
		prezzoVolo=v.getPrezzo();
		int totale=(int)(Math.ceil((prezzoVolo+prezzoHotel+prezzoEscursione)*1.15)); //aggiungo il 15% di guadagno
		packet.setPrezzo(totale);
		Calendar data1 = Calendar.getInstance();
		Calendar data2 = Calendar.getInstance();
		data1.setTime(v.getData());
		data2.setTime(v.getDataRitorno());
		long milliseconds1 = data1.getTimeInMillis();
		long milliseconds2 = data2.getTimeInMillis();
		long diff = milliseconds2 - milliseconds1;
		long diffDays = diff / (24 * 60 * 60 * 1000);  //differenza in giorni
		permanenza=(int)diffDays;
	}
	public void resetPrezzo(){
		packet.setPrezzo(0);
	}
}
